package com.lnt.mq.rabbitmq.producer;

import com.lnt.mq.rabbitmq.util.RabbitConstant;
import com.lnt.mq.rabbitmq.util.RabbitUtil;
import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 消费者
 */
public class Consumer {

    public static void main(String[] args) throws IOException, TimeoutException {
        //获取TCP长连接
        Connection connection = RabbitUtil.getConnection();
        // 创建通信信道，相当于TCP中的虚拟连接
        Channel channel = connection.createChannel();

        //创建队列，声明并创建一个队列，如果队列已经存在，就使用这个队列
        // 第一个参数:s :队列名称ID
        // 第二个参数:b :是否持久化，false表示不持久化，MQ停掉数据会丢失
        // 第三个参数:b1:是否队列私有化,false则代表所有消费者都可以访问,true表示只有第一次拥有他的消费者才能一直使用
        // 第四个参数:b2:是否自动删除,false代表连接停机后不自动删除这个队列
        // 第五个参数:map:其他额外参数
        channel.queueDeclare(RabbitConstant.QUEUE_HELLOWORLD, false, false, false, null);

        // 从MQ中获取数据
        // 绑定监听队列
        // 第二个参数代表是否自动确认收到的消息, false代表手动编程来确认消息, 这是MQ的推荐做法
        // 第三个参数代表要传入的DefaultConsumer的实现类
        channel.basicConsume(RabbitConstant.QUEUE_HELLOWORLD, false, new Reciver(channel));


    }

    static class Reciver extends DefaultConsumer{

        private Channel channel;

        public Reciver(Channel channel) {
            super(channel);
            this.channel = channel;
        }

        @Override
        public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
            String message = new String(body);

            System.out.println("消费者收到的消息:" + message);

            System.out.println("消息的tagId:" + envelope.getDeliveryTag());
        }
    }
}
